/**
 * FileObj
 *
 */
if(typeof (module) !="undefined"){
    module.exports = FileObj;


    var PrintObj = require('./PrintObj');
    var Serializer = require('./Serializer');
    var Effect = require('../common/Effect');
    var FStylizeShadow = require('../color/FStylizeShadow');
    var FEffectBase = require('../color/FEffectBase');
    var config = require('../../config').getConfig();
    var gm = require('gm').subClass({imageMagick: true});
    var im = require('imagemagick'); // 图像处理
    var common = require('../../common');
    var fs = require('fs');
    var Serializer = require('./Serializer');
}




function FileObj()
{
    PrintObj.call(this);        // 继承第1/4步（派生类）：用父的构造函数来初始化子的context（就是将父的数据带到子中）

    this.fp = "";   // file-path
    this.t = -1;    //0: 背景   1: 装饰原件   2: image   3：装饰相框
    this.di=-1;     // 在数据库中的Id ,db-id,
    this.hr = 1;    //horizontal reverse， 水平翻转 ,1：正常,-1:水平翻转
    this.vr = 1;    //vertical reverse， 垂直翻转 ,1：正常,-1:垂直翻转
    this.ss = 1.0;  // 抽图和原图的比，为了计算dpi是否够印刷要求

    this.ct = Serializer.prototype.CLASS_TYPE_FILEOBJ;
}
FileObj.prototype = new PrintObj(); // 继承第2/4步（派生类）：继承父的原型链；注意：后续自身的原型链函数要放在后面，如：FileObj.prototype.fromJson）

// 转成json字符串
FileObj.prototype.toJson= function(){
    // 去掉父json字符串的头尾
    var superJson = PrintObj.prototype.toJson.call(this);
    superJson = superJson.substr(1,superJson.length-2);

    var ret = '{';
    ret +=superJson;
    ret +=',';
    ret +=('"fp":'+'"'+this.fp+'"');
    ret +=',';
    ret +=('"t":'+this.t);
    ret +=',';
    ret +=('"di":'+'"'+this.di+'"');
    ret +=',';
    ret +=('"hr":'+this.hr);
    ret +=',';
    ret +=('"vr":'+this.vr);
    ret +=',';
    ret +=('"ss":'+this.ss);

    ret+='}';
    return ret;
}
// 从json对象中解析出PointPath
FileObj.prototype.fromJson = function(jsonObj, versionId){      //  继承第3/4步（派生类）：重载的fromJson
    PrintObj.prototype.fromJson.call(this, jsonObj,versionId);  //  继承第3/4步（派生类）：调用父的fromJson
    this.fp = jsonObj.fp;
    this.t = jsonObj.t;
    this.di = jsonObj.di;
    this.hr = jsonObj.hr;
    this.vr = jsonObj.vr;
    this.ss = jsonObj.ss;
}

/**
 * 将对象添加到PDF中
 * @param doc  PDFDocument结构
 * @param info  对象结构，属性如下：
 *                  docOriginX  文档的新原点 在原始原点的 坐标
 *                  docOriginY  文档的新原点 在原始原点的 坐标
 *                  clip        （在GraphObj对象中有效）true表示剪切蒙版，false表示普通对象
 */
FileObj.prototype.addToPdf = function(doc, info){
    // 保存上下文环境
    Serializer.prototype.before.call(this, doc, info);
    // 描绘图像(将图片服务器的uploads文件夹映射到本工程下，并用本工程的路径访问)
    // windows 下的映射方式：
    //      1, 进入backServer\public 删除 uploads
    //      2, mklink .\uploads ..\..\ImageServer\public\uploads /J
    // __dirname 为本js所在的文件夹
    doc.opacity(this.al);
    doc.image(this.fp,0, 0, {width:this.w,height:this.h})
//  doc.image(__dirname+"/../../..../ImageServer/public"+this.fp.replace(config.IMAGE_HOST, ""), 0, 0, {width:this.w,height:this.h});

    // 还原上下文环境
    Serializer.prototype.after.call(this, doc,info);
}




/**
 * 生成图片投影，此时图片的网络路径为物理路径
 * @param imageObj  图片对象
 * @param callback  处理完成后的回调函数
 */
FileObj.prototype.getImgShadow = function(imageObj,callback){
    var style = imageObj.style();
    var realPath = imageObj.fp;
    var type = imageObj.imgFilter();
    var p = realPath.lastIndexOf('.');
    var a_2_r = Math.PI/180;                                  //角度转换为弧度
    var filterImgPath = realPath.substring(0,p)+'_'+type+'_'+common.genTimeRandom()+realPath.substring(p);
    if(style){
        // 取得原图的宽高
        im.identify(realPath,function(err,features){
            if(err) throw err;
            var w = features.width;
            var h = features.height;
            var scale = imageObj.w/w;
            var distance = style.d;
            var angle = style.an;
            var color = style.clr.toFormatRGBStr();
            var alpha = 100*style.al;                        //alpha取值为(0,1),ImageMagic单位是百分比
            var blurX = style.bx;
            var xOffset = distance*Math.cos(angle*a_2_r);
            var yOffset = distance*Math.sin(angle*a_2_r);
            var s = ""+alpha+"x"+blurX+"+"+xOffset/scale+"+"+yOffset/scale;
            // 拼接命令，生成图片阴影
            var paras = new Array();
            paras.push(realPath);
            paras.push('(');
            paras.push('+clone');
            paras.push('-background');
            paras.push(color);
            paras.push('-shadow');
            paras.push(s);
            paras.push(')');
            paras.push('+swap');
            paras.push('-background');
            paras.push('none');
            paras.push('-layers');
            paras.push('merge');
            paras.push('+repage');
            //当滤镜为黑白效果以及带透明度的图片会导致pdfkit出错，需要将生成的图片模式由灰度图转换成RGB图
            paras.push('-define');
            paras.push('png:color-type=6')
            paras.push(filterImgPath);
            paras.join(' ');
            im.convert(paras,function(err){
                if(err) throw err;
                    imageObj.fp = filterImgPath;
                    imageObj.w += Math.abs(xOffset);
                    imageObj.h += Math.abs(yOffset);
                    imageObj.x1 = imageObj.x+xOffset;
                    imageObj.y1 = imageObj.y+yOffset;
                    if(imageObj.x1< imageObj.x||imageObj.y1<imageObj.y){
                        imageObj.x = imageObj.x1;
                        imageObj.y = imageObj.y1;
                    }else{
                        imageObj.x = imageObj.x;
                        imageObj.y = imageObj.y;
                    }
                    callback(imageObj.fp);
                });

        });
    }else{
        imageObj.fp = realPath;
        callback();
    }
}




